package models
/*********************************************************/
/********************本文档为数据库结构文档******************/
/***********************User的数据结构*********************/
/*********************version:1.0*************************/
/****Copyright (c) 2014年 许剑华. All rights reserved******/
/*********************************************************/
import (
	"errors"

	"time"
	"github.com/astaxie/beego/orm"
	"github.com/astaxie/beego/validation"
	."smart_home/lib"
	"github.com/astaxie/beego"
)
type User struct {
	Id          	int64		`orm:"unique;auto"`
	Tel				string		`orm:"unique;size(200)" form:"Email"  valid:"Required;MaxSize(200);MinSize(11)"`
	UserName    	string		`orm:"size(100)" form:"Username"  valid:"Required;MaxSize(20);MinSize(6)"`
	UserPw			string		`orm:"size(100)" form:"Password" valid:"Required;MaxSize(20);MinSize(6)"`
	FamilyMemID    	string
	//Group     		*Group   `orm:"rel(one)"` // OneToOne relation
	Createtime    	time.Time   `orm:"type(datetime);auto_now_add" `
	LastUpdateTime	time.Time
}

type Group struct {
	Id          int64
	TotalMem    int
	//User        *User   `orm:"reverse(one)"` // 设置反向关系(可选)
}


//验证用户信息
func checkUser(u *User) (err error) {
	valid := validation.Validation{}
	b, _ := valid.Valid(&u)
	if !b {
		for _, err := range valid.Errors {
			//log.Println(err.Key, err.Message)
			beego.Error("err.Key",err.Key,"err.Message",err.Message)
			return errors.New(err.Message)
		}
	}
	return nil
}

//添加用户
//@param u  User      要添加
//@return   int64     返回用户的id
//@return   error     返回错误，如果无错，返回值为空
func AddUser(u *User) (int64, error) {
	if err := checkUser(u); err != nil {
		return 0, err
	}
	o := orm.NewOrm()
	user := new(User)
	user.Tel = u.Tel
	user.UserPw = Strtomd5(u.UserPw)
	user.LastUpdateTime = time.Now() //time.Date(1991,1,1,0,0,0,0,0,time.UTC)
//	fmt.Println("user:",user)
//	fmt.Println("UserName:",user.Tel)
	id, err := o.Insert(user)
	return id, err
}

//更新用户
//@param u  User      要更新的用户结构体
//@return   int64     返回用户的id
//@return   error     返回错误，如果无错，返回值为空
func UpdateUser(u *User) (int64, error) {
	if err := checkUser(u); err != nil {
		return 0, err
	}
	o := orm.NewOrm()
	user := make(orm.Params)
	if len(u.UserName) > 0 {
		user["UserName"] = u.UserName
	}

	if len(u.UserPw) > 0 {
		user["UserPw"] = Strtomd5(u.UserPw)
	}
	if len(user) == 0 {
		return 0, errors.New("update field is empty")
	}
	var table User
	num, err := o.QueryTable(table).Filter("Id", u.Id).Update(user)
	return num, err
}
//通过ID删除用户
//@param Id  int64    要删除用户的id
//@return   int64     返回用户的id
//@return   error     返回错误，如果无错，返回值为空
func DelUserById(Id int64) (int64, error) {
	o := orm.NewOrm()
	status, err := o.Delete(&User{Id: Id})
	return status, err
}
//通过电话号码获取用户
//@param tel  string  用户的电话号码
//@return   User      返回用户的数据结构体
//@return   error     返回错误，如果无错，返回值为空
func GetUserByTel(tel string) (user User,err error) {
	user = User{Tel: tel}
	o := orm.NewOrm()
	err = o.Read(&user, "Tel")
	if err == orm.ErrNoRows {
//		fmt.Println("查询不到")
	} else if err == orm.ErrMissPK {
//		fmt.Println("找不到主键")
	}
//	fmt.Println("找到数据：",user)
	return user,err
}
//通过用户id获取用户
	//@param id  int64  用户的ID
//@return   User      返回用户的数据结构体
//@return   error     返回错误，如果无错，返回值为空
func GetUserById(id int64) (user User,err error) {
	user = User{Id: id}
	o := orm.NewOrm()
	err = o.Read(&user, "Id")
	if err == orm.ErrNoRows {
//		fmt.Println("查询不到")
		return user,err
	} else if err == orm.ErrMissPK {
//		fmt.Println("找不到主键")
		return user,err
	}
//	fmt.Println("找到数据：",user)
	return user,err
}

//更新用户的密码
//@param id  int64    用户的ID
//@param pw  string      用户的新密码
//@return   error     返回错误，如果无错，返回值为空
func UpdateUserpw(id int64,pw string)(error){
	o := orm.NewOrm()
	user ,err:= GetUserById(id)
	if err != nil{
		return err
	}
	user.UserPw = Strtomd5(pw)
	_,err = o.Update(&user)
	return err
}

//更新用户的密码
//@param id  int64    用户的ID
//@param pw  string      用户的新密码
//@return   error     返回错误，如果无错，返回值为空
func UpdateUserByTel(tel string,pw string)(error){
	o := orm.NewOrm()
	user ,err:= GetUserByTel(tel)
	if err != nil{
		return err
	}
	user.UserPw = Strtomd5(pw)
	_,err = o.Update(&user)
	return err
}
func UpdateLastUpdateTime(id int64)(error){
	o := orm.NewOrm()
	user ,err:= GetUserById(id)
	if err != nil{
		return err
	}
	user.LastUpdateTime = time.Now()
	_,err = o.Update(&user)
	return err
}
func init() {
	// 需要在init中注册定义的model
	orm.RegisterModel(new(User),new(Group))
}


